package com.example.leetcode.trainingcamp.week5.Thursday.expand;

import java.util.Arrays;

/**
 * 珂珂喜欢吃香蕉。这里有 N 堆香蕉，第 i 堆中有 piles[i] 根香蕉。警卫已经离开了，将在 H 小时后回来。
 *
 * <p>珂珂可以决定她吃香蕉的速度 K （单位：根/小时）。每个小时，她将会选择一堆香蕉，从中吃掉 K 根。如果这堆香蕉少于 K 根，她将吃掉这堆的所有香蕉，然后这一小时内不会再吃更多的香蕉。
 *
 * <p>珂珂喜欢慢慢吃，但仍然想在警卫回来前吃掉所有的香蕉。
 *
 * <p>返回她可以在 H 小时内吃掉所有香蕉的最小速度 K（K 为整数）。
 *
 * <p>
 *
 * <p>示例 1：
 *
 * <p>输入: piles = [3,6,7,11], H = 8 输出: 4 示例 2：
 *
 * <p>输入: piles = [30,11,23,4,20], H = 5 输出: 30 示例 3：
 *
 * <p>输入: piles = [30,11,23,4,20], H = 6 输出: 23
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/koko-eating-bananas
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test875 {

    //[3,6,7,11] 8  ->4
    public int minEatingSpeed(int[] piles, int h) {
        Arrays.sort(piles);
        int len = piles.length;
        if (len == h) return piles[len -1];
        // 二分
        int high = piles[len -1];
        int low = 1;
        while (low <= high){
            int mid = low + (high -low) / 2 ;
            if (add(piles,mid) >h){
                low = mid +1;
            }else {
                high = mid-1 ;
            }
        }
      // 取出最小的就是low
        return low;
    }

    public int add(int[] piles,int speed){
        int sum = 0;
        for ( int pile : piles) {
            sum += (pile + speed -1) /speed;
        }
        return sum;
    }
}


class Demo875{
  public static void main(String[] args) {
    Test875 t = new Test875();
    int[] piles = {3,6,7,11};
    int h = 8;
    System.out.println(t.minEatingSpeed(piles, h));
  }
}